package serializers.json;
import java.io.StringWriter;
import java.io.Writer;
import java.util.ArrayList;
import java.util.List;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import serializers.*;
import com.jayway.jsonpath.JsonPath;
import data.media.Image;
import data.media.Media;
import data.media.MediaContent;
/**
* Driver that uses JsonPath [http://code.google.com/p/json-path/], with JSONPath parsing.
* Uses JSON.simple for serialization.
*/
public class JsonPathDeserializerOnly
{
public static void register(TestGroups groups)
{
groups.media.add(JavaBuiltIn.mediaTransformer,
new SemiManualSerializer("json/jsonpath/manual"),
new SerFeatures(
SerFormat.JSON,
SerGraph.FLAT_TREE,
SerClass.MANUAL_OPT,
""
)
);
}
static class SemiManualSerializer extends Serializer<MediaContent>
{
private final String name;
public SemiManualSerializer(String name)
{
this.name = name;
}
public String getName()
{
return name;
}
public MediaContent deserialize(byte[] array) throws Exception
{
String mediaContentJsonInput = new String(array, "UTF-8");
return readMediaContent(mediaContentJsonInput);
}
public byte[] serialize(MediaContent mediaContent) throws Exception
{
StringWriter writer = new StringWriter();
writeMediaContent(writer, mediaContent);
writer.flush();
return writer.toString().getBytes("UTF-8");
}
@SuppressWarnings("unchecked")
private static JSONObject createJsonObject(Media media)
{
JSONObject jsonObject = new JSONObject();
if (media.hasBitrate)
{
jsonObject.put("bitrate", media.bitrate);
}
jsonObject.put("copyright", media.copyright);
jsonObject.put("duration", media.duration);
jsonObject.put("format", media.format);
jsonObject.put("height", media.height);
int size = media.persons.size();
JSONArray personsJsonArray = new JSONArray();
for (int i = 0; i < size; i++)
{
personsJsonArray.add(media.persons.get(i));
}
jsonObject.put("persons", personsJsonArray);
jsonObject.put("player", media.player.name());
jsonObject.put("size", media.size);
jsonObject.put("title", media.title);
jsonObject.put("uri", media.uri);
jsonObject.put("width", media.width);
return jsonObject;
}
private static void writeMedia(Writer writer, Media media) throws Exception
{
JSONObject jsonObject = createJsonObject(media);
jsonObject.writeJSONString(writer);
}
@SuppressWarnings("unchecked")
private static JSONObject createJsonObject(Image image)
{
JSONObject jsonObject = new JSONObject();
jsonObject.put("height", image.height);
jsonObject.put("size", image.size.name());
jsonObject.put("title", image.title);
jsonObject.put("uri", image.uri);
jsonObject.put("width", image.width);
return jsonObject;
}
private static void writeImage(Writer writer, Image image) throws Exception
{
JSONObject jsonObject = createJsonObject(image);
jsonObject.writeJSONString(writer);
}
private static void writeImages(Writer writer, List<Image> images) throws Exception
{
JSONArray jsonArray = createJsonArray(images);
jsonArray.writeJSONString(writer);
}
@SuppressWarnings("unchecked")
private static JSONArray createJsonArray(List<Image> images)
{
JSONArray jsonArray = new JSONArray();
for (Image image : images)
{
jsonArray.add(createJsonObject(image));
}
return jsonArray;
}
@SuppressWarnings("unchecked")
static void writeMediaContent(Writer writer, MediaContent mediaContent) throws Exception
{
JSONObject jsonObject = new JSONObject();
jsonObject.put("media", createJsonObject(mediaContent.media));
jsonObject.put("images", createJsonArray(mediaContent.images));
jsonObject.writeJSONString(writer);
}
private static Media readMedia(String mediaJsonInput) throws Exception
{
Media media = new Media();
Object bitrate = JsonPath.read(mediaJsonInput, "$.bitrate");
if (bitrate != null && bitrate instanceof Long)
{
media.bitrate = ((Long) bitrate).intValue();
media.hasBitrate = true;
}
media.copyright = JsonPath.read(mediaJsonInput, "$.copyright");
media.duration = (Long) JsonPath.read(mediaJsonInput, "$.duration");
media.format = JsonPath.read(mediaJsonInput, "$.format");
media.height = ((Long) JsonPath.read(mediaJsonInput, "$.height")).intValue();
List<String> persons = JsonPath.read(mediaJsonInput, "$.persons[*]");
media.persons = persons;
media.player = Media.Player.valueOf((String) JsonPath.read(mediaJsonInput, "$.player"));
media.size = (Long) JsonPath.read(mediaJsonInput, "$.size");
media.title = JsonPath.read(mediaJsonInput, "$.title");
media.uri = JsonPath.read(mediaJsonInput, "$.uri");
media.width = ((Long) JsonPath.read(mediaJsonInput, "$.width")).intValue();
return media;
}
private static Image readImage(String imageJsonInput) throws Exception
{
Image image = new Image();
image.height = ((Long) JsonPath.read(imageJsonInput, "$.height")).intValue();
image.size = Image.Size.valueOf((String) JsonPath.read(imageJsonInput, "$.size"));
image.title = JsonPath.read(imageJsonInput, "$.title");
image.uri = JsonPath.read(imageJsonInput, "$.uri");
image.width = ((Long) JsonPath.read(imageJsonInput, "$.width")).intValue();
return image;
}
private static Image readImage(JSONObject jsonObject)
{
Image image = new Image();
image.height = ((Long) JsonPath.read(jsonObject, "$.height")).intValue();
image.size = Image.Size.valueOf((String) JsonPath.read(jsonObject, "$.size"));
image.title = JsonPath.read(jsonObject, "$.title");
image.uri = JsonPath.read(jsonObject, "$.uri");
image.width = ((Long) JsonPath.read(jsonObject, "$.width")).intValue();
return image;
}
private static List<Image> readImages(String imagesJsonInput) throws Exception
{
JSONArray imagesJsonArray = (JSONArray) JsonPath.read(imagesJsonInput, "$[*]");
return readImages(imagesJsonArray);
}
private static List<Image> readImages(JSONArray imagesJsonArray) throws Exception
{
int size = imagesJsonArray.size();
List<Image> images = new ArrayList<Image>(size);
for (int i = 0; i < size; i++)
{
images.add(readImage((JSONObject) imagesJsonArray.get(i)));
}
return images;
}
private static MediaContent readMediaContent(String mediaContentJsonInput) throws Exception
{
MediaContent mediaContent = new MediaContent();
Media media = new Media();
Object bitrate = JsonPath.read(mediaContentJsonInput, "$.media.bitrate");
if (bitrate != null && bitrate instanceof Long)
{
media.bitrate = ((Long) bitrate).intValue();
media.hasBitrate = true;
}
media.copyright = JsonPath.read(mediaContentJsonInput, "$.media.copyright");
media.duration = (Long) JsonPath.read(mediaContentJsonInput, "$.media.duration");
media.format = JsonPath.read(mediaContentJsonInput, "$.media.format");
media.height = ((Long) JsonPath.read(mediaContentJsonInput, "$.media.height")).intValue();
List<String> persons = JsonPath.read(mediaContentJsonInput, "$.media.persons[*]");
media.persons = persons;
media.player = Media.Player.valueOf((String) JsonPath.read(mediaContentJsonInput, "$.media.player"));
media.size = (Long) JsonPath.read(mediaContentJsonInput, "$.media.size");
media.title = JsonPath.read(mediaContentJsonInput, "$.media.title");
media.uri = JsonPath.read(mediaContentJsonInput, "$.media.uri");
media.width = ((Long) JsonPath.read(mediaContentJsonInput, "$.media.width")).intValue();
JSONArray imagesJsonArray = (JSONArray) JsonPath.read(mediaContentJsonInput, "$.images[*]");
List<Image> images = readImages(imagesJsonArray);
mediaContent.media = media;
mediaContent.images = images;
return mediaContent;
}
}
}